package com.ttx.algorithm.leetcode.game;

import java.util.HashMap;
import java.util.Map;

/**
 * https://leetcode-cn.com/problems/nim-game/   <br>
 *   Nim game
 *
 * <p>
 *     你和你的朋友，两个人一起玩 Nim 游戏：桌子上有一堆石头，每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。
 *
 *     你们是聪明人，每一步都是最优解。 编写一个函数，来判断你是否可以在给定石头数量的情况下赢得游戏。  <br>
 *
 *      输入: 4
 *      输出: false
 *      解释: 如果堆中有 4 块石头，那么你永远不会赢得比赛；
 *      因为无论你拿走 1 块、2 块 还是 3 块石头，最后一块石头总是会被你的朋友拿走。
 *
 * </p>
 *
 * @author TimFruit
 * @date 19-10-1 下午7:34
 */
public class P292NimGame {

    // ========================
    Map<Integer, Boolean> resultMap =new HashMap<Integer, Boolean>(); //缓存先手的结果



    public boolean canWinNim01(int n) {
        if(n<=0){
            return false;
        }
        // 初始化
        resultMap.put(1, true);
        resultMap.put(2, true);
        resultMap.put(3, true);

        boolean result1, result2, result3;
        for(int i=4;i<=n;i++){

            // 拿1块
            result1=resultMap.get(i-1);

            // 拿2块
            result2=resultMap.get(i-2);

            // 拿3块
            result3=resultMap.get(i-3);

            if(!result1 || !result2 || !result3){ //到对手拿时,对手存在输的情况,就是本人赢的时候
                resultMap.put(i, true);
            }else {
                resultMap.put(i, false);
            }

            System.out.println(i+" -> "+resultMap.get(i));
        }

        return resultMap.get(n);
    }



    public boolean canWinNim02(int n) {
        //规律题
        // 3+1  必输
        return n%(3+1)!=0;



    }




}
